package br.jus.tjpe.bean;

import java.util.ArrayList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import br.jus.tjpe.dominio.Parte;
import br.jus.tjpe.dominio.Processo;
import br.jus.tjpe.dominio.ProcessoParte;
import br.jus.tjpe.dominio.TipoParte;
import br.jus.tjpe.dominio.Vara;
import br.jus.tjpe.negocio.ParteServico;
import br.jus.tjpe.negocio.ProcessoServico;
import br.jus.tjpe.negocio.TipoParteServico;
import br.jus.tjpe.negocio.VaraServico;
import br.jus.tjpe.otd.ParteOTD;
import br.jus.tjpe.otd.ProcessoParteOTD;
import br.jus.tjpe.util.MessageResource;
import br.jus.tjpe.util.MessageResourceFactory;

public class ProcessoBean {

	private List<Processo> processos;

	private List<Vara> varas;

	private List<ParteOTD> partes;

	private List<TipoParte> tiposParte;

	private Processo processo;

	private Parte parte;

	private TipoParte tipoParte;

	private List<ProcessoParteOTD> partesProcesso;

	private ProcessoParteOTD parteProcesso;

	@EJB
	private ProcessoServico processoServico;

	@EJB
	private VaraServico varaServico;

	@EJB
	private ParteServico parteServico;

	@EJB
	private TipoParteServico tipoParteServico;

	public List<ProcessoParteOTD> getPartesProcesso() {
		return partesProcesso;
	}

	public void setPartesProcesso(List<ProcessoParteOTD> partesProcesso) {
		this.partesProcesso = partesProcesso;
	}

	public List<Processo> getProcessos() {
		if (processos == null) {
			carregarProcessos();
		}
		return processos;
	}

	public void setProcessos(List<Processo> processos) {
		this.processos = processos;
	}

	public Processo getProcesso() {
		return processo;
	}

	public void setProcesso(Processo processo) {
		this.processo = processo;
	}

	public List<Vara> getVaras() {
		return varas;
	}

	public void setVaras(List<Vara> varas) {
		this.varas = varas;
	}

	public List<ParteOTD> getPartes() {
		return partes;
	}

	public void setPartes(List<ParteOTD> partes) {
		this.partes = partes;
	}

	public List<TipoParte> getTiposParte() {
		return tiposParte;
	}

	public void setTiposParte(List<TipoParte> tiposParte) {
		this.tiposParte = tiposParte;
	}

	public Parte getParte() {
		return parte;
	}

	public void setParte(Parte parte) {
		this.parte = parte;
	}

	public TipoParte getTipoParte() {
		return tipoParte;
	}

	public void setTipoParte(TipoParte tipoParte) {
		this.tipoParte = tipoParte;
	}

	public ProcessoParteOTD getParteProcesso() {
		return parteProcesso;
	}

	public void setParteProcesso(ProcessoParteOTD parteProcesso) {
		this.parteProcesso = parteProcesso;
	}
	
	private void carregarProcessos() {
		this.processos = this.processoServico.consultarProcessos();
	}

	public String manterProcesso() {
		carregarProcessos();
		return "manterProcesso";
	}

	public String cadastrarProcesso() {
		this.varas = this.varaServico.consultarVaras();
		this.partes = ParteOTD.parseToOTD(this.parteServico.consultarPartes());
		this.tiposParte = this.tipoParteServico.consultarTiposParte();

		this.processo = new Processo();
		return "cadastrarProcesso";
	}

	public String removerProcesso() {
		this.processoServico.remover(this.processo);
		carregarProcessos();
		return "manterProcesso";
	}

	public String editarProcesso() {
		this.varas = this.varaServico.consultarVaras();
		this.partes = ParteOTD.parseToOTD(this.parteServico.consultarPartes());
		this.tiposParte = this.tipoParteServico.consultarTiposParte();

		return "cadastrarProcesso";
	}

	public void adicionarParteProcesso() {
		if (this.parte != null && this.tipoParte != null) {
			if (this.partesProcesso == null) {
				this.partesProcesso = new ArrayList<ProcessoParteOTD>();
			}

			ProcessoParte parteProcesso = new ProcessoParte();
			parteProcesso.setParte(this.parte);
			parteProcesso.setTipoParte(this.tipoParte);
			parteProcesso.setProcesso(this.processo);

			this.partesProcesso.add(ProcessoParteOTD.parseToOTD(parteProcesso));
		}
	}

	public void removerParteProcesso() {
		this.partesProcesso.remove(this.parteProcesso);
	}

	public String salvar() {
		String outcome = null;
		boolean valido = true;

		this.processo.setPartes(ProcessoParteOTD.parseToEntity(this.partesProcesso));
		FacesContext context = FacesContext.getCurrentInstance();
		MessageResource message = MessageResourceFactory.createMessageResource("mensagens");

		if (processo.getNpu() == null || processo.getNpu().isEmpty()) {
			context.addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_WARN, message.get("processo.npu.obrigatorio"), message
							.get("processo.npu.obrigatorio")));
			valido = false;
		}

		if (processo.getVara() == null) {
			context.addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_WARN, message.get("processo.vara.obrigatoria"), message
							.get("processo.vara.obrigatoria")));
			valido = false;
		}

		if (processo.getData() == null) {
			context.addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_WARN, message.get("processo.data.obrigatoria"), message
							.get("processo.data.obrigatoria")));
			valido = false;
		}

		if (processo.getPartes() == null || processo.getPartes().size() <= 0) {
			context.addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_WARN, message.get("processo.parte.obrigatoria"), message
							.get("processo.parte.obrigatoria")));
			valido = false;
		}

		if (valido) {
			this.processoServico.salvar(this.processo);
			carregarProcessos();
			
			outcome = "manterProcesso";
		} else {
			outcome = "cadastrarProcesso";
		}

		return outcome;
	}

}
